/*
 *Autor: Anderson Campos Cardoso
 *
 *Conteúdo: Arquivo que contém a implementação dos métodos da classe Video
 */

/*#include<iostream>
#include <SDL_image.h>
*/
#include "Video.h"

#ifndef _VIDEO_CPP_
#define _VIDEO_CPP_

using namespace std;

/*
 *Inicia o subsistema de vídeo, criando a janela na memória da placa de vídeo
 */
void Video::iniciaVideo(void)
{
   /*A função SDL_Init() é usada para iniciar os subsistemas da SDL, deve ser chamada antes de
    *qualquer outra função SDL. retorna um valor negativo se ocorrer um problema.
    *
    */
   if(SDL_Init(SDL_INIT_VIDEO) < 0)
   {
      cout << "Erro em video::iniciaVideo(void), ao iniciar subsistema de vídeo " << SDL_GetError() << endl;
   }
   else
   {
      /*SDL_SetVideoMode(largura,altura,profundidade de cores,FLAG) é uma função que seta as
       *preferências da janela, a profundidade de cores quando setada com o valor "0" serve para
       *deixar a SDL escolher a melhor configuração, o flag SDL_HWSURFACE serve para criar a
       *janela na memória da placa de vídeo, e o flag SDL_DOUBLEBUF serve para que seja possível
       *usar o doblebuffering da placa de vídeo
       */
      cena = SDL_SetVideoMode(SCREEN_WIDTH,SCREEN_HEIGTH,0,SDL_HWSURFACE|SDL_DOUBLEBUF);
      if (cena == NULL)
      {
          cout << "Erro em video::iniciaVideo(void), ao setar preferências de vídeo " << SDL_GetError() << endl;
      }
   }
}

/*
 *Faz um blit da imagem com a cena
 */
void Video::blitImagemCena(SDL_Surface *imagemOrigem,SDL_Rect *orig,SDL_Rect *dest)
{
	if(SDL_BlitSurface(imagemOrigem,orig,cena,dest))
		fprintf(stderr,"erro em Video::blitImagemCena(): %s\n", SDL_GetError());
}

/*
 *Carrega o nome do arquivo passado como parâmetro no atributo fundo
 */
void Video::carregaFundo(string nomeFundo)
{
   int i,j;
   SDL_Rect orig,dest;
   orig.w = TILE_WIDTH;
   orig.h = TILE_HEIGTH;
   dest.w = TILE_WIDTH;
   dest.h = TILE_HEIGTH;
   if((tiles = IMG_Load(nomeFundo.c_str()))== NULL)//string.c_str() retorna um char equivalente a string
      fprintf(stderr,"Erro ao carregar arquivo de tiles: %s\n",IMG_GetError());
   else
   {
      for(i=0;i<(SCREEN_WIDTH/TILE_WIDTH);i++)
      {
         orig.x = i*TILE_HEIGTH;
         dest.x = i*TILE_HEIGTH;
         for(j=0;j<(SCREEN_HEIGTH/TILE_HEIGTH);j++)
         {
            orig.y = j*TILE_WIDTH;
            dest.y = j*TILE_WIDTH;
            blitImagemCena(tiles,&orig,&dest);
         }
      }
   }
}

/*
 *faz um blit do fundo com a cena correspondente ao retângulo passado como parâmetro
 */
void Video::limpaCena(SDL_Rect *origDest)
{
	blitImagemCena(tiles,origDest,origDest);
}

/*
 *Imprime a imagem armazenada em cena na janela
 */
void Video::imprimeCena(void)
{
   SDL_Flip(cena);//muda a cena na janela
}

/*
 *Construtor da Classe
 */
Video::Video(void)
{
   cena = NULL;
   tiles = NULL;
}

/*
 *Destrutor da classe
 */
Video::~Video(void)
{
   if (cena != NULL)
      SDL_FreeSurface(cena);
   if (tiles != NULL)
      SDL_FreeSurface(tiles);
}
#endif

